const IS_PROD = ['production'].includes(process.env.NODE_ENV) // 是否是生产环境
// const IS_YANSHI = process.argv.includes('--yanshi')
// const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
const TerserPlugin = require('terser-webpack-plugin')
const defaultAPI = require('./defaultConfig')
const ProdCopyStag = require('./webpackPlugins/ProdCopyStag')

const Timestamp = new Date().getTime()

console.log(process.env.NODE_ENV)
// console.log(process.argv)
console.log(`生产环境？-----------${IS_PROD}`)
const cdn = {
  ...defaultAPI.cdn.link
}
const dev = {
  ...defaultAPI.dev.link
}

module.exports = {
  runtimeCompiler: true,
  // outputDir: IS_YANSHI ? 'dist_stag' : 'dist/prod',
  // publicPath: '/newb2c', // 设置打包文件相对路径
  publicPath: defaultAPI.publicPath, // 设置打包文件绝地路径
  devServer: {
    disableHostCheck: true,
    host: '0.0.0.0',
    port: 80,
    open: true // 配置自动启动浏览器
    // https: true
    // proxy: {
    //   [defaultAPI.prefix]: {
    //     target: IS_PROD ? defaultAPI.proAPI : defaultAPI.devAPI,
    //     secure: false,
    //     changeOrigin: true
    //   }
    // }
  },
  configureWebpack: config => {
    config.output.filename = `js/[name].[hash:8].${Timestamp}.js`
    config.output.chunkFilename = `js/[name].[hash:8].${Timestamp}.js`

    // 生产环境
    if (IS_PROD) {
      config.externals = defaultAPI.cdn.config
      // 为生产环境修改配置...
      config.plugins.push(
        // 生产环境自动删除console
        // new UglifyJsPlugin({
        //   uglifyOptions: {
        //     compress: {
        //       drop_debugger: true,
        //       drop_console: true
        //     }
        //   },
        //   sourceMap: false,
        //   parallel: true
        // })
        new TerserPlugin({
          cache: true,
          terserOptions: {
            compress: {
              pure_funcs: [
                'console.log',
                'console.count'
              ]
            }
          }
        }),
        new ProdCopyStag({
          baseRetain: true, // 是否保留原始打包文件 -- 默认 true
          basePath: '/prod', // 原始输出文件路径 -- 默认 /base
          // 替换错误回调
          // error: ({ path, content, success }) => {
          //   success(content)
          // },
          // 复制文件参数
          options: [{
            replaceFile: ['js', 'html'], // 需要替换的文件类型 -- 如果不传的话，不会去替换任何内容
            replacePath: '/stag', // 替换后的文件输出目录 -- 不写输出路径的话是不会输出替换后的文件
            // 替换规则
            rules: [
              {
                reg: new RegExp('d.zowoyoo.com/saasb2c/', 'g'), // 需要替换的内容
                value: 'd.zowoyoo.com/saasb2cstag/' // 替换后的值
              },
              {
                reg: new RegExp('https://d.zowoyoo.com/ajax/libs/zwy', 'g'),
                value: 'https://d.zowoyoo.com/ajax/libs/zwystag'
              }
            ]
          }]
        })
      )
    }
  },
  // eslint-loader 是否在保存的时候检查
  lintOnSave: true,

  // 默认情况下 babel-loader 忽略其中的所有文件 node_modules
  transpileDependencies: [],

  // 生产环境 sourceMap
  productionSourceMap: false,

  // 配置高于chainWebpack中关于 css loader 的配置
  css: {
    // 是否开启支持 foo.module.css 样式
    // requireModuleExtension: false,

    // 是否使用 css 分离插件 ExtractTextPlugin，采用独立样式文件载入，不采用 <style> 方式内联至 html 文件中
    extract: IS_PROD,

    // 是否构建样式，false 将提高构建速度
    sourceMap: !IS_PROD,
    // sourceMap: true,

    // css预设器配置项
    loaderOptions: {
      css: {
        // options here will be passed to css-loader
      },

      postcss: {
        // options here will be passed to postcss-loader
        plugins: [
          require('postcss-pxtorem')({
            rootValue: 18.75, // 换算的基数
            propList: ['*']
          })
        ]
      }
    }
  },
  // 构建时开启多进程处理 babel 编译
  parallel: require('os').cpus().length > 1,

  // https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-pwa
  // pwa: {},

  // 第三方插件配置
  // pluginOptions: {

  // },
  chainWebpack: config => {
    config.resolve.symlinks(true)
    // config.output.filename(`[name].[hash].${Timestamp}.js`).end()
    config.optimization.splitChunks({
      chunks: 'all',
      cacheGroups: {}
    })
    if (IS_PROD) {
      config.plugin('html')
        .tap(args => {
          args[0].cdn = cdn
          return args
        })
    } else {
      config.plugin('html')
        .tap(args => {
          args[0].cdn = dev
          return args
        })
    }
  }
}
